namespace est13
{
    internal class class13
    {
        static void Main(string[] args)
        {
            Console.WriteLine("冒泡排序");
            #region     知识点一   排序的基本概念
            //排序是计算机内经常进行的一种操作，目的是将一组“无序”的记录序列调整为“有序”的记录序列
            //常用的排序例子
            //8 7 1 5 4 2 6 3 9
            //把上面的无序序列 变为有序（升序或降序）序列的过程
            //1 2 3 4 5 6 7 8 9 升
            //9 8 7 6 5 4 3 2 1 降

            //在程序中 序列一般 存储在数组当中
            //所以 排序往往是对 数组进行排序
            int[] arr = new int[] { 8,7,1,5,4,2,6,3,9 };
            //把数组里的内容变为有序的
            #endregion
            #region     知识点二   冒泡排序基本原理
            //8 7 1 5 4 2 6 3 9
            //两两相邻
            //不停比较
            //不停交换
            //比较n轮
            #endregion
            #region     知识点三   代码实现
            //第一步 如何比较数组中两两相邻的数

            //从头开始
            //第n个数和第n+1个数
            //for (int n = 0; n < arr.Length-n; n++)
                //这里-n的意思是长度为1到9，但数组是0到8
            //{
                //if (arr[n] > arr[n-1])
                //{
                    //第二步 交换位置
                    //中间商不赚差价
                    //int temp = arr[n];
                    //arr[n] = arr[n-1];
                    //arr[n-1] = temp;
                //}
            //}
                //第三步：如何换m轮
                //有几个数 就比较几轮

            //外面进行一个标识 来表示 该轮是否进行了交换
            bool Isshort = false;
                for (int m = 0;m < arr.Length; m++)
            {
                Isshort = false;//每一轮开始默认没有进行过交换
                for (int n = 0; n < arr.Length - 1 - m; n++)
                //这里-n的意思是长度为1到9，但数组是0到8
                {
                    if (arr[n] > arr[n + 1])
                    {
                        Isshort = true;
                        //第二步 交换位置
                        //中间商不赚差价
                        int temp = arr[n];
                        arr[n] = arr[n + 1];
                        arr[n + 1] = temp;
                    }
                }
                //当一轮结束以后 如果Issgort这个标识还是false
                //那就意味着已经是最终序列了，不需要在判断交换
                if(Isshort)
                {
                    break;
                }    
            }
                for (int m = 0; m < arr.Length; m++)
            {
                Console.WriteLine(arr[m]);
            }
                //第四步 优化
                //1.确定位置的数字 不用比较了
                //确定了一轮后 极值（最大或者最小）已经放到了对应的位置（往后放）
                //所以 没完成n轮 后面位置的数字就不参与比较了
                //length-1后-m
            #endregion

                //总结： 
                //基本概念
                //两两相邻
                //不停比较
                //比较m轮

                //套路与写法
                //两层循环
                //外层轮数
                //内层比较
                //两值比较
                //满足交换

                //如果优化
                //1.比不过比
                //2.加入bool值

        }
    }
}
